#!/bin/bash

devices="7"             # 默认使用的设备
operator=""             # 默认为空，不指定用例
mode="private"          # 默认个人执行脚本，每日流水mode=daily
MOTD_FILE="/etc/motd"
ATK_DIR=$(pwd)
DATE=$(date +%Y%m%d%H%M)

# 解析命令行参数
while getopts "d:r:m:h" opt; do
    case $opt in
        d) devices="$OPTARG"
           echo "[INFO][GMM&场景融合算子组] 指定使用设备: $devices"
           ;;
        r) operator="$OPTARG"
           echo "[INFO][GMM&场景融合算子组] 指定运行算子用例: $operator"
           ;;
        m) mode="$OPTARG"
           echo "[INFO][GMM&场景融合算子组] 运行的模式: $mode"
           ;;
        h) echo "使用方法: $0 [选项]"
           echo "选项说明:"
           echo "  -m <模式>   运行模式（默认: private）"
           echo "              可选值: private(个人使用)、daily(每日冒烟专项)"
           echo "  -d <设备>   指定运行设备（默认: 7卡）"
           echo "  -r <用例>   指定运行用例（默认: 空，不运行）"
           echo "              可选值: custom(每日冒烟，安装custom包执行)、"
           echo "                      poc(跑全量ATK用例，环境由使用者指定)、"
           echo "                      各个算子的IR名字(执行对应算子)"
           echo "  -h          显示此帮助信息"
           exit 0
           ;;
        \?) echo "无效选项: -$OPTARG" >&2
            exit 1
            ;;
        :) echo "选项 -$OPTARG 需要参数" >&2
           exit 1
           ;;
    esac
done

if [ $operator == "custom" ]; then
    readarray -t op_names < "transformer_op.txt"

    echo "总共 ${#op_names[@]} 个名称"

    # 遍历数组
    for one_case in "${op_names[@]}"; do
        echo "处理: $one_case"
        echo "[INFO][GMM&场景融合算子组] 开始执行$one_case用例"
        atk node --backend PYACLNN --devices $devices -o $ATK_DIR node --backend CPU task -c $ATK_DIR/atk_case/$one_case/$one_case.json --task accuracy -p $ATK_DIR/atk_case/$one_case/$one_case.py -to 1000
    done

elif [ $operator == "poc" ]; then
    cd $ATK_DIR || exit
    echo "[INFO][GMM&场景融合算子组] 开始执行所有算子用例"
    for folder in $ATK_DIR/atk_case/*/; do
        one_case=$(basename "$folder")
        echo "[INFO][GMM&场景融合算子组] 开始执行$one_case用例"
        atk node --backend PYACLNN --devices $devices -o $ATK_DIR node --backend CPU task -c $ATK_DIR/atk_case/$one_case/$one_case.json --task accuracy -p $ATK_DIR/atk_case/$one_case/$one_case.py -to 1000
    done
elif [ $operator == "" ]; then
    echo "[INFO][GMM&场景融合算子组] 请使用-r指定对应的用例，您未输入！"
else
    echo "[INFO][GMM&场景融合算子组] 开始运行$operator算子用例"
    atk node --backend PYACLNN --devices $devices -o $ATK_DIR node --backend CPU task -c $ATK_DIR/atk_case/$operator/$operator.json --task accuracy -p $ATK_DIR/atk_case/$operator/$operator.py -to 1000
fi

if [ $mode == "daily" ]; then
    mkdir -p /data/daily/output
    cd $ATK_DIR
    python3 check_precision.py > /data/daily/output/${DATE}.txt 2>&1

    # 7. 检查精度结果并更新motd
    if grep -q "精度未通过" "/data/daily/output/${DATE}.txt"; then
        error_details=$(sed -n '/以下文件存在精度不通过的记录：/,$p' "/data/daily/output/${DATE}.txt")
        # 使用双引号包裹变量并正确插入换行
        REMINDER="[ERROR] [$DATE] [$operator] 每日冒烟结果：$operator存在精度未通过。详情：
${error_details}
完整日志：/data/daily/output/${DATE}.txt"
    elif grep -q "处理文件时出错" "/data/daily/output/${DATE}.txt"; then
        REMINDER="[warning] [$DATE] [$operator] 每日冒烟结果: $operator用例执行失败"
    else
        REMINDER="[success] [$DATE] [$operator] 每日冒烟结果：所有$operator用例精度全部通过"
    fi

    # 定义固定内容的起止标记
    SEPARATOR="^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"

    # 保留两个分隔符之间的内容，删除其他部分
    if [ -f "${MOTD_FILE}" ]; then
        # 使用sed提取两个分隔符之间的内容（包括分隔符本身）
        # 第一个分隔符开始，第二个分隔符结束
        sed -n "/^${SEPARATOR}$/,/^${SEPARATOR}$/p" "${MOTD_FILE}" > "${MOTD_FILE}.tmp"
        
        # 检查是否成功提取到内容
        if [ -s "${MOTD_FILE}.tmp" ]; then
            mv "${MOTD_FILE}.tmp" "${MOTD_FILE}"
        else
            # 如果未找到分隔符对，保留原始文件
            echo "[INFO][GMM&场景融合算子组] 警告：未找到完整的分隔符对，保留原始文件内容"
            rm -f "${MOTD_FILE}.tmp"
        fi
    fi

    # 写入新的提醒信息和分隔线
    echo -e "${REMINDER}" >> "${MOTD_FILE}"
    echo "__________________________________________________" >> "${MOTD_FILE}"

    echo ${REMINDER}
    echo "[INFO][GMM&场景融合算子组] 所有任务执行完成"
fi

exit 0
